#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>

// void* run_thread(void* arg)
// {
//     char* msg = (char*)arg;
//     while(1)
//     {
//         printf("I am the thread one\n");
//         sleep(1);
//     }

// }
// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, NULL, run_thread, NULL);
//     //if(n != 0)  printf("pthread create fail\n");

//     while(1)
//     {
//         printf("I am main thread\n");
//         sleep(1);
//     }

    
//     return 0;
// }

// int count = 0;
// void* Routine()
// {
//     while(1)
//     {
//         count++;
//         sleep(1);
//     }
//     pthread_exit((void*)0);
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, NULL, Routine, NULL);
//     while(1)
//     {
//         printf("%d\n", count);
//         sleep(1);
//     }
//     pthread_join(tid, NULL);
//     return 0;
// }

//不加锁
// int tickets = 1000;

// void* TicketsGrabbing(void* arg)
// {
//     const char* name = (char*)arg;
//     while(1)
//     {
//         if(tickets > 0)
//         {
//             //线程挂起等待10ms，usleep比sleep更精细，能有效利用cpu的时间
//             usleep(10000);
//             printf("[%s] get a ticket, left: %d\n", name, --tickets);
//         }
//         else{
//             break;
//         }
//     }
//     printf("%s quit\n", name);
//     pthread_exit((void*)0);
// }

// int main()
// {
//     pthread_t t1, t2, t3, t4;
//     pthread_create(&t1, NULL, TicketsGrabbing, "thread 1");
//     pthread_create(&t2, NULL, TicketsGrabbing, "thread 2");
//     pthread_create(&t3, NULL, TicketsGrabbing, "thread 3");
//     pthread_create(&t4, NULL, TicketsGrabbing, "thread 4");

//     //线程等待，不等待的话会导致资源无法释放
//     pthread_join(t1, NULL);
//     pthread_join(t2, NULL);
//     pthread_join(t3, NULL);
//     pthread_join(t4, NULL);

//     return 0;
// }

//加锁
// int tickets = 1000;
// pthread_mutex_t mutex;

// void* TicketsGrabbing(void* arg)
// {
//     const char* name = (char*)arg;
//     while(1)
//     {
//         //加锁
//         pthread_mutex_lock(&mutex);
//         if(tickets > 0)
//         {
//             //线程挂起等待10ms，usleep比sleep更精细，能有效利用cpu的时间
//             usleep(10000);
//             printf("[%s] get a ticket, left: %d\n", name, --tickets);
//             pthread_mutex_unlock(&mutex);
        
//         }
//         else{
//             pthread_mutex_unlock(&mutex);
//             break;
//         }
//     }
//     printf("%s quit\n", name);
//     pthread_exit((void*)0);
// }

// int main()
// {
//     pthread_mutex_init(&mutex, NULL);
//     pthread_t t1, t2, t3, t4;
//     pthread_create(&t1, NULL, TicketsGrabbing, "thread 1");
//     pthread_create(&t2, NULL, TicketsGrabbing, "thread 2");
//     pthread_create(&t3, NULL, TicketsGrabbing, "thread 3");
//     pthread_create(&t4, NULL, TicketsGrabbing, "thread 4");

//     //线程等待，不等待的话会导致资源无法释放
//     pthread_join(t1, NULL);
//     pthread_join(t2, NULL);
//     pthread_join(t3, NULL);
//     pthread_join(t4, NULL);
//     pthread_mutex_destroy(&mutex);
//     return 0;
// }

//简单地模拟死锁
pthread_mutex_t mutex;


void* Routine(void* arg)
{
    pthread_mutex_lock(&mutex);
    pthread_mutex_lock(&mutex);

    pthread_exit((void*)0);
}



int main()
{


    pthread_t t1, t2;
    pthread_mutex_init(&mutex, NULL);
    pthread_create(&t1, NULL, Routine, "thread 1");
    pthread_create(&t2, NULL, Routine, "thread 2");

    pthread_join(t1, NULL);
    pthread_join(t2, NULL);

    pthread_mutex_destroy(&mutex);
    return 0;
}
